//
//  NSObject+Serializable.h
//  SwiftDemo
//
//  Created by Yuan on 2017/5/13.
//  Copyright © 2017年 YuanLiang's MacBook. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol TJSerializableProtocol <NSObject>

/**
 提供Array内填充数据的类型
 例: 
 - (Class)serializableTypeInArray:(NSString *)arrayName {
     if ([arrayName isEqualToString:@"arrayProperty"]) {
         return [CustomModel class];
     }
     return nil;
 }

 @param arrayName Array类型属性的propertyName
 @return 数组内数据类型
 */
- (Class _Nullable)serializableTypeInArray:(NSString * _Nonnull)arrayName;

@optional
/**
 自定义解Json 如实现此方法 当前Class作为Model中的成员时  parseJsonObject方法失效

 @param jsonObject Dictionary类型JsonObj
 */
- (void)parseJsonObjectManual:(NSDictionary * _Nonnull)jsonObject;

// 一般保持以下两个方法返回结果一致
// 序列化过程中乎略的属性
- (NSArray<NSString *> *_Nullable)propertiesIgnoreInSerialize;
// 反序列化过程乎略的属性
- (NSArray<NSString *> *_Nullable)propertiesIgnoreInDeserialize;

// 一般保持以下两个方法返回结果一致
// key:name of class property, value: name in json.
- (NSDictionary<NSString *,NSString *> *_Nullable)propertiesSerializeNameMapping;
// key:name of class property, value: name for json.
- (NSDictionary<NSString *,NSString *> *_Nullable)propertiesDeserializeNameMapping;

@end



/**
 序列化工具
 */
@interface NSObject (Serializable)


/**
 Json填充至object
 @warning: Swift中 Int, Float, Double, Bool等基础类型声明时若用了Optional将无法赋值, 
            OC中没有映射关系的类型无法赋值，如Tuple, Character
 
 @param jsonObject json格式对象 兼容String, Data, Dictionary三种
 */
- (void)parseJsonObject:(id _Nullable)jsonObject;


/**
 obj序列化成Json
 @warning: Dictionary内存放的对象无法序列化
        String Number Dictionary会直接返回自己 其他非自定义类型 return nil
 @return 根据需求选用不同序列化方法
 */
- (id _Nullable)serializableToDictionary;
- (NSString *_Nullable)serializableToString;
- (NSData *_Nullable)serializableToData;

@end
